package com.fjh.csdn_spider.utils.dedicated_utils;

import java.io.File;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fjh.csdn_spider.utils.common_utils.RegexUtil;

/**
 * 解析用户页面,并将csdn的栏目结构转换成对于的文件夹结构
 * 
 * @author Antg
 * @date 2021年7月22日
 */
public class CSDNColumnToDir {
	/**
	 * 根据csdn的栏目结构生成对应的目录结构
	 * 
	 * @param code
	 *            下载下来的代码
	 * @param filePath
	 *            要再那个目录下生成
	 * @date 2021年7月22日
	 * @author Antg
	 */
	public static void generateDirByCSDNColumn(String code, String filePath) {
		// 首先根据代码筛选出有效数据
		String columnCode = getColumnCode(code);
		// 将上面的字符串转换为一个json对象
		JSONObject jsonObject = JSON.parseObject(columnCode);
		// 获取数组
		JSONArray jsonArray = jsonObject.getJSONArray("columnModule");
		// 创建一个json数组来存储csdn中的目录结构
		JSONArray resultArray = getColumnArray(jsonArray);
		//根据这个json数组来创建一个相同目录结构的文件夹
		createDirByJsonArray(filePath, resultArray);
		//提示
		System.out.println("文件创建完毕");
	}
	
	public static void createDirByJsonArray(String targetPath,JSONArray jsonArray){
		//遍历 这个数组
		for(int i = 0;i<jsonArray.size();i++){
			JSONObject tempObject = jsonArray.getJSONObject(i);
			JSONArray tempArray = tempObject.getJSONArray("secondList");
			String firstTitle = tempObject.getString("title");
			new File(targetPath+File.separator+firstTitle).mkdir();
			if(tempArray!=null){
				for(int j = 0;j<tempArray.size();j++){
					String secondTitle = tempArray.getJSONObject(j).getString("title");
					new File(targetPath+File.separator+firstTitle+File.separator+secondTitle).mkdir();
				}	
			}
			
		}
	}

	/**
	 * 根据页面代码筛选出有效数据,返回一个json字符串
	 * 
	 * @param code
	 * @return
	 * @date 2021年7月22日
	 * @author Antg
	 */
	private static String getColumnCode(String code) {
		String regex = "\"columnModule\":[\\s\\S]*?]";
		return "{" + RegexUtil.getMatchContent(code, regex) + "}";

	}
	/**
	 * 创建一个json数组来存储csdn中的目录结构
	 * @param jsonArray
	 * @return
	 * @date 2021年7月23日
	 * @author Antg
	 */
	public static JSONArray getColumnArray(JSONArray jsonArray){
		// 创建一个json数组来存储csdn中的目录结构
				/**
				 * 思路: 从第一个开始,判断它的下一个是否是二级目录(最后一个除外),是的话就将第一个创建为一个数组,然后 将后面的二级目录添加到该数组中
				 * 直到不是一个二级目录
				 */
				JSONArray resultArray = new JSONArray();
				for (int i = 0; i < jsonArray.size(); i++) {
					JSONObject currentObj = jsonArray.getJSONObject(i);

					// 获取当前和下一个元素是几级标题
					boolean nextflag = false;// 下一个
					boolean currentflag = currentObj.getBooleanValue("second");// 当前
					if (i != jsonArray.size() - 1) {
						// 不是最后一个的时候,获取当前的下一个对象
						JSONObject nextObj = jsonArray.getJSONObject(i + 1);
						// 如果下一个对象是一个二级标题,那么创建一个数组,否则创建一个对象
						if (nextObj.getBooleanValue("second") == true) {
							nextflag = true;
						}
					}

					// 如果当前是二级标题,那么就将该元素添加到上一个数组中
					if (currentflag) {
						// 从当前位置的上面,向上遍历直到找到第一个数组
						for (int j = i - 1; j >= 0; j--) {
							if (jsonArray.getJSONObject(j).getBooleanValue("second")==false) {
								//接着去定位结果数组中的位置
								String title = jsonArray.getJSONObject(j).getString("title");
								for(int k  = 0;k<resultArray.size();k++){
									if(title.equals(resultArray.getJSONObject(k).getString("title"))){
										JSONObject tempObj = new JSONObject();
										tempObj.put("title",currentObj.getString("title"));
										tempObj.put("second",true);
										resultArray.getJSONObject(k).getJSONArray("secondList").add(tempObj);
									}
								}						
								break;
							}

						}

					} else {
					//如果是一级标题,进行判断下一个 的操作
						if (nextflag) {
							// 如果下一个是二级标题,那么就创建一个数组来存储这些二级标题
							JSONArray tempArray = new JSONArray();
							// 创建一个对象
							JSONObject tempObj = new JSONObject();
							// 将数组添加到对象中
							tempObj.put("title", currentObj.getString("title"));
							tempObj.put("second", false);
							tempObj.put("secondList", tempArray);
							// 将对象添加到结果中
							resultArray.add(tempObj);
						} else {
							JSONObject tempObj = new JSONObject();
							// 将标题写入到结果中
							tempObj.put("title", currentObj.getString("title"));
							tempObj.put("second", false);
							resultArray.add(tempObj);
						}
					}

				}
				return resultArray;
	}
}
